b649890e93431e865e98d7d8373922b39d079e5f
[openwrt/openwrt.git] /
1 From 9008cdacdc41f8233f4444b86cf3a17201686e2d Mon Sep 17 00:00:00 2001
2 From: Shiji Yang <yangshiji66@outlook.com>
3 Date: Tue, 18 Jul 2023 20:18:16 +0800
4 Subject: [PATCH 5/5] wifi: rt2x00: support loading eeprom from NVMEM cells
5
6 This patch allows rt2x00 to load eeprom from "eeprom" NVMEM cell.
7
8 Example:
9
10 /* load eeprom from NVMEM provider 'eep' */
11 &wmac {
12 nvmem-cells = <&eep>;
13 nvmem-cell-names = "eeprom";
14 };
15
16 Signed-off-by: Shiji Yang <yangshiji66@outlook.com>
17 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
18 ---
19 .../net/wireless/ralink/rt2x00/rt2x00eeprom.c | 41 ++++++++++++++++++-
20 1 file changed, 40 insertions(+), 1 deletion(-)
21
22 --- a/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
23 +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00eeprom.c
24 @@ -15,11 +15,11 @@
25 #include <linux/mtd/mtd.h>
26 #include <linux/mtd/partitions.h>
27 #endif
28 +#include <linux/nvmem-consumer.h>
29
30 #include "rt2x00.h"
31 #include "rt2x00soc.h"
32
33 -#if IS_ENABLED(CONFIG_MTD)
34 static void rt2800lib_eeprom_swap(struct rt2x00_dev *rt2x00dev)
35 {
36 struct device_node *np = rt2x00dev->dev->of_node;
37 @@ -33,6 +33,7 @@ static void rt2800lib_eeprom_swap(struct
38 rt2x00dev->eeprom[i] = swab16(rt2x00dev->eeprom[i]);
39 }
40
41 +#if IS_ENABLED(CONFIG_MTD)
42 static int rt2800lib_read_eeprom_mtd(struct rt2x00_dev *rt2x00dev)
43 {
44 struct device_node *np = rt2x00dev->dev->of_node, *mtd_np = NULL;
45 @@ -86,6 +87,40 @@ static int rt2800lib_read_eeprom_mtd(str
46 }
47 #endif
48
49 +static int rt2800lib_read_eeprom_nvmem(struct rt2x00_dev *rt2x00dev)
50 +{
51 + struct device_node *np = rt2x00dev->dev->of_node;
52 + unsigned int len = rt2x00dev->ops->eeprom_size;
53 + struct nvmem_cell *cell;
54 + const void *data;
55 + size_t retlen;
56 + int ret = 0;
57 +
58 + cell = of_nvmem_cell_get(np, "eeprom");
59 + if (IS_ERR(cell))
60 + return PTR_ERR(cell);
61 +
62 + data = nvmem_cell_read(cell, &retlen);
63 + nvmem_cell_put(cell);
64 +
65 + if (IS_ERR(data))
66 + return PTR_ERR(data);
67 +
68 + if (retlen != len) {
69 + dev_err(rt2x00dev->dev, "invalid eeprom size, required: 0x%04x\n", len);
70 + ret = -EINVAL;
71 + goto exit;
72 + }
73 +
74 + memcpy(rt2x00dev->eeprom, data, len);
75 +
76 + rt2800lib_eeprom_swap(rt2x00dev);
77 +
78 +exit:
79 + kfree(data);
80 + return ret;
81 +}
82 +
83 static const char *
84 rt2x00lib_get_eeprom_file_name(struct rt2x00_dev *rt2x00dev)
85 {
86 @@ -153,6 +188,10 @@ int rt2x00lib_read_eeprom(struct rt2x00_
87 return 0;
88 #endif
89
90 + ret = rt2800lib_read_eeprom_nvmem(rt2x00dev);
91 + if (!ret)
92 + return 0;
93 +
94 return rt2x00lib_read_eeprom_file(rt2x00dev);
95 }
96 EXPORT_SYMBOL_GPL(rt2x00lib_read_eeprom);